﻿using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Growatt.CreateCCode
{
    public class InsertCSVToExcel
    {

        public static void TestInsertSetCellFormula()
        {
            #region 测试1
            //// 创建一个新的工作簿，对于.xlsx格式使用XSSFWorkbook，对于.xls格式使用HSSFWorkbook  
            //IWorkbook workbook = new XSSFWorkbook(); // 或者 new HSSFWorkbook();  
            //ISheet sheet = workbook.CreateSheet("Sheet1");

            //// 假设你已经有了其他必要的数据在$B2, $F2, $G2单元格中  
            //// 这里只是为了演示，我们设置一些初始值  
            //IRow row = sheet.CreateRow(1); // $B2, $F2, $G2对应的行是第二行（索引为1）  
            //row.CreateCell(1).SetCellValue(50); // $B2的值为50  
            //row.CreateCell(5).SetCellValue(40); // $F2的值为40  
            //row.CreateCell(6).SetCellValue(60); // $G2的值为60  

            //// 创建需要填入公式的单元格  
            //row = sheet.CreateRow(3); // 我们假设在第四行（索引为3）的某个单元格填入公式  
            //ICell cell = row.CreateCell(1); // 假设在第四行的第二列（B列）填入公式  

            //// 设置单元格的公式  
            //cell.CellType = CellType.Formula; // 设置为公式类型  
            //cell.CellFormula = "=IF(AND($B$2>=$G$2, $B$2<=$F$2), \"通过\", \"不通过\")"; // 填入公式，注意使用了绝对引用$来锁定单元格  

            //// 保存工作簿到文件  
            //using (FileStream file = new FileStream("example.xlsx", FileMode.Create, FileAccess.Write))
            //{
            //    workbook.Write(file);
            //}

            //// 清理资源  
            //workbook.Close(); 
            #endregion
            // 创建一个新的工作簿，对于.xlsx格式使用XSSFWorkbook，对于.xls格式使用HSSFWorkbook  
            IWorkbook workbook = new XSSFWorkbook(); // 或者 new HSSFWorkbook();  
            ISheet sheet = workbook.CreateSheet("Sheet1");

            // 假设你已经有了其他必要的数据在$B2, $F2, $G2单元格中  
            // 这里只是为了演示，我们设置一些初始值  
            IRow row = sheet.CreateRow(1); // $B2, $F2, $G2对应的行是第二行（索引为1）  
            row.CreateCell(1).SetCellValue(50); // $B2的值为50  
            row.CreateCell(5).SetCellValue(40); // $F2的值为40  
            row.CreateCell(6).SetCellValue(60); // $G2的值为60  

            // 创建需要填入公式的单元格  
            row = sheet.CreateRow(3); // 我们假设在第四行（索引为3）的某个单元格填入公式  
            ICell cell = row.CreateCell(1); // 假设在第四行的第二列（B列）填入公式  

            // 设置单元格的公式  
            cell.SetCellFormula("IF(AND($B2>=$G2, $B2<=$F2), \"通过\", \"不通过\")"); // 填入公式，注意使用了绝对引用$来锁定单元格  

            // 保存工作簿到文件  
            using (FileStream file = new FileStream("example.xlsx", FileMode.Create, FileAccess.Write))
            {
                workbook.Write(file);
            }

            // 清理资源  
            workbook.Close();


        }




        /// <summary>
        /// 删除空行
        /// </summary>
        /// <param name="filePath"></param>
        public static void DeleteEmptyRowExcel(string filePath = "example2.xlsx")
        {
            // 假设你有一个Excel文件路径  
            // 设置LicenseContext属性
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            // 加载Excel文件  
            using (ExcelPackage package = new ExcelPackage(new FileInfo(filePath)))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; // 获取第一个工作表  

                int emptyRowCount = 0; // 用于计数空行的数量  
                int lastRowWithData = -1; // 记录最后一个有数据的行的索引  

                // 从最后一行开始遍历  
                for (int i = worksheet.Dimension.End.Row; i >= worksheet.Dimension.Start.Row; i--)
                {
                    bool isRowEmpty = true; // 假设当前行是空的  

                    // 检查当前行的每个单元格是否都有数据  
                    for (int j = worksheet.Dimension.Start.Column; j <= worksheet.Dimension.End.Column; j++)
                    {
                        if (!string.IsNullOrEmpty(worksheet.Cells[i, j].Value?.ToString()))
                        {
                            isRowEmpty = false; // 如果找到非空单元格，则当前行不是空的  
                            lastRowWithData = i; // 更新最后一个有数据的行的索引  
                            break;
                        }
                    }

                    if (isRowEmpty)
                    {
                        emptyRowCount++; // 空行数量加一  
                    }
                    else
                    {
                        // 如果遇到非空行，并且之前的空行数超过1行，则删除这些空行  
                        if (emptyRowCount > 1)
                        {


                            // 删除从当前行的下一行开始，到最后一个有数据的行的下一行的所有行  
                            int deleteStartRow = i + 1;
                            int deleteEndRow = lastRowWithData + 1; // 如果有数据，则删除到最后一个有数据的行的下一行；否则，删除到当前行的下一行  
                            worksheet.DeleteRow(deleteStartRow, 100);
                        }

                        // 重置空行计数器  
                        emptyRowCount = 0;
                    }
                }

                // 保存更改  
                package.SaveAs(new FileInfo(filePath));
            }

            Console.WriteLine("处理完成！");
        }





        public static void TestInsertSetCellFormula2()
        {

            // 设置LicenseContext属性
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            using (ExcelPackage package = new ExcelPackage())
            {
                ExcelWorksheet sheet = package.Workbook.Worksheets.Add("Sheet1");

                // 假设你已经有了其他必要的数据在$B2, $F2, $G2单元格中  
                // 这里只是为了演示，我们设置一些初始值  
                sheet.Cells["B2"].Value = 50;
                sheet.Cells["F2"].Value = 40;
                sheet.Cells["G2"].Value = 60;

                // 创建需要填入公式的单元格  
                sheet.Cells["B4"].FormulaR1C1 = "=IF(AND(R2C2>=R2C7, R2C2<=R2C6), \"通过\", \"不通过\")";

                // 保存工作簿到文件  
                package.SaveAs(new FileInfo("example2.xlsx"));
            }

        }
        public static void TestInsertSetCellFormula3()
        {

            // 设置LicenseContext属性
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            using (ExcelPackage package = new ExcelPackage(new FileInfo("example.xlsx")))
            {
                ExcelWorksheet sheet = package.Workbook.Worksheets[0];

                int rowCount = sheet.Dimension.Rows;

                for (int row = 2; row <= rowCount; row++)
                {
                    string formula = $"IF(AND($B{row}>=$G{row}, $B{row}<=$F{row}), \"通过\", \"不通过\")";
                    sheet.Cells[row, 8].Formula = formula;
                }

                package.Save();
            }

        }


    }
}
